home *** CD-ROM | disk | FTP | other *** search
/ The Atari Compendium / The Atari Compendium (Toad Computers) (1994).iso / files / umich / telecomm / fnordadl / fn132src.zoo / citutil / mchange.c < prev    next >
C/C++ Source or Header  |  1991-09-02  |  4KB  |  149 lines

  1. /*
  2.  * mchange.c -- change the value of #mailslots (the maximum number of mail
  3.  * messages that users may see at one time)
  4.  *
  5.  * 90Jun05 A&R    Created as part of 1.3 release.
  6.  */
  7.  
  8. #include "ctdl.h"
  9. #include "room.h"
  10. #include "log.h"
  11. #include "config.h"
  12. #include "citlib.h"
  13.  
  14. char *program = "mchange";
  15. int newmailslots;
  16.  
  17. /* Get a yes/no response from console */
  18. int
  19. getyesno(void)
  20. {
  21.     int c;
  22.  
  23.     while (1) {
  24.     c = toupper(getch());
  25.     if (c == 'Y' || c == 'N')
  26.         break;
  27.     }
  28.     putchar(c);
  29.     putchar('\n');
  30.     if (c == 'N')
  31.     return NO;
  32.     else
  33.     return YES;
  34. }
  35.  
  36. void
  37. modifyroom(void)
  38. {
  39.     getRoom(MAILROOM);
  40.     NUMMSGS = newmailslots;
  41.     roomBuf.msg = (theMessages *)realloc(roomBuf.msg, MSG_BULK);
  42.     putRoom(MAILROOM);
  43. }
  44.  
  45. void
  46. modifylogs(void)
  47. {
  48.     int i, oldlog, newlog, oldmailslots, j, shrink = 0;
  49.     PATHBUF oldfile, newfile;
  50.  
  51.     ctdlfile(oldfile, cfg.sysdir, "ctdllog.sys");
  52.     if ((oldlog = dopen(oldfile, O_RDONLY)) < 0)
  53.     crashout("cannot open %s", oldfile);
  54.  
  55.     ctdlfile(newfile, cfg.sysdir, "ctdllog.tmp");
  56.     if ((newlog = dcreat(newfile)) < 0)
  57.     crashout("cannot create %s", newfile);
  58.  
  59.     oldmailslots = MAILSLOTS;
  60.     if (newmailslots < oldmailslots)
  61.     shrink = oldmailslots - newmailslots; 
  62.  
  63.     for (i = 0; i < cfg.logsize; i++) {
  64.     MAILSLOTS = oldmailslots;
  65.     getlog(&logBuf, i, oldlog);
  66.     printf("Modifying log #%d", i);
  67.     if (readbit(logBuf, uINUSE))
  68.         printf(" (%s)", logBuf.lbname);
  69.     putchar('\n');
  70.     MAILSLOTS = newmailslots;
  71.     if (shrink > 0)    /* we're shrinking! Hep! */
  72.         for (j = 0; j < MAILSLOTS - shrink; j++) {
  73.         logBuf.lbmail[j].msgloc = logBuf.lbmail[shrink + j].msgloc;
  74.         logBuf.lbmail[j].msgno = logBuf.lbmail[shrink + j].msgno;
  75.         }
  76.  
  77.     logBuf.lbmail = (theMessages *) realloc(logBuf.lbmail, MAIL_BULK);
  78.  
  79.     if (shrink < 0)    {    /* We're expanding! Watch out! */
  80.         for (j = newmailslots - 1; j > 0 - shrink; j--) {
  81.         logBuf.lbmail[j].msgloc = logBuf.lbmail[shrink + j].msgloc;
  82.         logBuf.lbmail[j].msgno = logBuf.lbmail[shrink + j].msgno;
  83.         }
  84.         for (j = 0; j < -shrink; j++)    /* zero new entries */
  85.         zero_struct(logBuf.lbmail[j]);
  86.     }
  87.     putlog(&logBuf, i, newlog);
  88.     }
  89.     MAILSLOTS = oldmailslots;
  90.  
  91.     dclose(oldlog);
  92.     dclose(newlog);
  93.  
  94.     if (dunlink(oldfile))
  95.     crashout("cannot unlink %s", oldfile);
  96.     if (drename(newfile, oldfile))
  97.     crashout("cannot rename %s to %s", oldfile, newfile);
  98. }
  99.  
  100. main(int argc, char **argv)
  101. {
  102.     int p, junk;
  103.  
  104.     setbuf(stdout, NULL);
  105.     printf("%s for Fnordadel V%s\n", program, VERSION);
  106.  
  107.     if (argc == 2)
  108.     newmailslots = atoi(argv[1]);
  109.     else {
  110.     fprintf(stderr, "usage: %s <new max number of mailslots>\n", program);
  111.     if (fromdesk())
  112.         hitkey();
  113.     exit(1);
  114.     }
  115.  
  116.     if ((newmailslots > MAXMAILSLOTS) || (newmailslots < MINMAILSLOTS))
  117.     crashout("new mailslots must be between %d and %d", MINMAILSLOTS,
  118.         MAXMAILSLOTS);
  119.     else if (newmailslots > SANEMAILSLOTS) {
  120.     printf("Do you really want %d mail slots? (y/n) ", newmailslots);
  121.     if (!getyesno())
  122.         crashout("Okay");
  123.     }
  124.     else if (newmailslots == MAILSLOTS)
  125.     crashout("mailslots is already %d", newmailslots);
  126.  
  127.     if (readSysTab(FALSE) && makelock(&p)) {
  128.     initroomBuf(&roomBuf);
  129.     initlogBuf(&logBuf);
  130.  
  131.     modifylogs();    /* hack on all the log entries */
  132.     modifyroom();    /* hack on room0001.sys */
  133.  
  134.     printf("Be sure to change ctdlcnfg.sys to reflect the new value of\n");
  135.     printf("mailslots (%d).  Then run configur.  If you don't, your\n",
  136.         newmailslots);
  137.     printf("system will explode.\n"); 
  138.     MAILSLOTS = newmailslots;
  139.     junk = writeSysTab();
  140.     wipelock(&p);
  141.  
  142.     killroomBuf(&roomBuf);
  143.     killlogBuf(&logBuf);
  144.     }
  145.     if (fromdesk())
  146.     hitkey();
  147.     exit(0);
  148. }
  149.